﻿// CTabMusicPlayer.cpp: 实现文件
//

#include "pch.h"
#include "DntDemo.h"
#include "afxdialogex.h"
#include "CTabMusicPlayer.h"
#include "Kc3xType.h"
#include "Kc3xRegiDiff.h"
#include "TxtUtils.h"
#include "FwbLog.h"
#include "DntTest.h"
#include "CPopAccount.h"
#define CPP CTabMusicPlayer::
#define TAG	"MusicPlayer"

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 标准C语言函数 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
extern KC3X_REGI_DIFF* mKc3x;
extern bool isTabKc3xRegi;
extern bool isPopKc3xRegi;

#define OFFSETOF(_type, _member) ((size_t)(&((_type *)0)->_member))		// 获取结构体内部成员变量的位置偏移

void CTabMusicPlayer::ShowSlider(int position) {
	CString text;
	if (mKc3x->Flag & 0x02) {				// 静音
		text.Format(L"主音量:%d / %d", 0, mKc3x->MaxMasterVol);
		((CSliderCtrl*)GetDlgItem(IDC_SLIDER_VOLUME))->SetPos(0);
		((CStatic*)GetDlgItem(IDC_SLIDER_VOLUME))->EnableWindow(false);		// 不能滑动滑块
	}
	else {
		if (position >= 0) {
			mKc3x->Volume = position;
		}
		if (mKc3x->MaxMasterVol > 0) {
			((CSliderCtrl*)GetDlgItem(IDC_SLIDER_VOLUME))->SetRange(0, mKc3x->MaxMasterVol);
		}
		text.Format(L"主音量:%d / %d", mKc3x->Volume, mKc3x->MaxMasterVol);
		((CSliderCtrl*)GetDlgItem(IDC_SLIDER_VOLUME))->SetPos(mKc3x->Volume);
		((CStatic*)GetDlgItem(IDC_SLIDER_VOLUME))->EnableWindow(true);		// 能滑动滑块
	}
	((CStatic*)GetDlgItem(IDC_STATIC_VOLUME))->SetWindowText(text);
}

void CPP ShowSpace(int position, int col) {
	mList1.InsertItem(position, L"", 0);
	for (int i = 0; i < col; i++) {
		mList1.SetItemText(position, i, L"");
	}
}

void CPP setLineText(int position, int sub, char* row) {
	if (row != NULL) {
		CString text1(row);
		mList1.SetItemText(position, sub, text1);
	}
	else {
		mList1.SetItemText(position, sub, L"");
	}
}

void CPP ShowLine(int position, char* row1, char* row2) {	// 显示每行的数据
	if (position >= gLine) {
		mList1.InsertItem(position, L"", 0);
		gLine = position + 1;
		CString text;
		text.Format(L"%d", gLine);
		mList1.SetItemText(position, 0, text);	// 第一列
	}
	setLineText(position, 1, row1);				// 第二列
	setLineText(position, 2, row2);				// 第三列
}

void CPP DispList() {										// 列表显示
	int position = 0;
	mList1.DeleteAllItems();
	gLine = 0;
	char name[256];
	char time[256];

	int total = mKc3x->FileQty & 0x3fff;					// 获取数量
	int counter = 0;
	for (; counter < total;) {
		int readed = GetValue("Length", counter);
		if (readed > 0) {
			counter += readed;
		}
		else {
			break;
		}
	}
	CLOGI(TAG, "列表总数量 TTTTB (%d)", counter);
	for (int index = 0; index < counter; index++) {
		GetText(name, sizeof(name), "Name", index);					// 读取歌曲名字
		int songtime = GetValue("Time", index);						// 读取歌曲时长
		TxtFormat(time, sizeof(time), "%02d:%02d", songtime / 60, songtime % 60);
		ShowLine(index, name, time);
	}
}

void CTabMusicPlayer::SetText(char* name, int index, char* text) {	// 写入文件内容
	char key[16];
	TxtFormat(key, sizeof(key), "%d", index);
	char bytes[1024];
	int len1 = GetPrivateProfileStringA(name, key, "", bytes, sizeof(bytes), gListsPath);
	int len2 = (int)strlen(text);
	if (len2 > 0 && len1 != len2 || memcmp(bytes, text, len2)) {
		//CLOGI(TAG, "不同文件路径AA (%s)(%d)(%s)(%s)", name, index, text ,gListsPath);
		WritePrivateProfileStringA(name, key, text, gListsPath);
	}
}
int CTabMusicPlayer::GetText(char* bytes, int SIZEOF, char* name, int index) {	// 读取文件内容
	char key[16];
	TxtFormat(key, sizeof(key), "%d", index);
	int length = GetPrivateProfileStringA(name, key, "", bytes, SIZEOF, gListsPath);
	bytes[length] = 0;
	return length;
}
void CTabMusicPlayer::SetValue(char* name, int index, int value) {	
	char bytes[16];
	TxtFormat(bytes, sizeof(bytes), "%d", value);
	SetText(name, index, bytes);
}
int CTabMusicPlayer::GetValue(char* name, int index) {	// 读取
	char key[16];
	char bytes[16];
	TxtFormat(key, sizeof(key), "%d", index);
	int length = GetPrivateProfileStringA(name, key, "", bytes, sizeof(bytes), gListsPath);
	bytes[length] = 0;
	return TxtToInt(bytes);
}

void CTabMusicPlayer::MakeFilePath() {						// 生成文件路径
	int qty = mKc3x->FileQty & 0x3fff;
	if (mKc3x != NULL && qty > 0) {
		char path[MAX_PATH];
		int offset = DbsGetExePath(path, sizeof(path), false);
		offset += TxtFormat(path + offset, sizeof(path) - offset, "Lists\\");
		if (!PathIsDirectoryA(path)) {
			CreateDirectoryA(path, 0);						// 不存在则创建
		}
		TxtFormat(gListsPath, sizeof(gListsPath), "%s%04x_%d.ini", path, mKc3x->NameCrc16, qty);
		//CLOGI(TAG, "生成文件路径AB (%s)", gListsPath);
	}
}

void CTabMusicPlayer::ShowAccount(bool init) {			// 账号信息
	char an_0[32];
	DbsGetMemText(an_0, sizeof(an_0), "an_0");
	char ap_0[32];
	DbsGetMemText(ap_0, sizeof(ap_0), "ap_0");
	char an_1[32];
	DbsGetMemText(an_1, sizeof(an_1), "an_1");
	char gv_1[32];
	DbsGetMemText(gv_1, sizeof(gv_1), "gv_1");
	char bytes[100];
	TxtFormat(bytes, sizeof(bytes), "%s&%s&%s&%s", an_0, ap_0, an_1, gv_1);
	CString text(bytes);
	((CEdit*)GetDlgItem(IDC_EDIT_LOGIN))->SetWindowText(text);
}

void CTabMusicPlayer::ShowRegister() {
	char bytes[8192];
	DNT_INFO* info = DntGetInfo();							// 获取DNT_INFO*
	int regSize = info->RegSize;
	ShowSlider(-1);											// 音量显示文字

	if ((mKc3x->SrcValid & 0x20) || (mKc3x->SrcValid & 0x40)) {		// SD插入 或 U盘插入
		if (mKc3x->InSource == 0x30 || mKc3x->InSource == 0x31) {	// SD卡播放 或 U盘播放
			if (gQty != mKc3x->FileQty) {
				CLOGI(TAG, "U盘播放 FFF (%d)(%d)(%d)(%d)", gQty, mKc3x->FileQty, GetValue("Length", -1), (mKc3x->FileQty & 0x3fff));
				gQty = mKc3x->FileQty;
				if (GetValue("Length", -1) == (mKc3x->FileQty & 0x3fff)) {	// 如果列表的总数等于设备的总数
					DispList();											// 列表显示(全部显示)
				}else {
					MakeFilePath();
					SetReg16(&mKc3x->NameSelect, 0);
					gLoadTick = (uint32_t)GetTickCount64();
					gPlayIdx = -1;
					gFileTime = -1;
					gPartList = true;									// 读取部分歌曲列表
				}				
			}
		}
	}

	if (gLoadTick > 0 && mKc3x->NameSelect == mKc3x->NamePosition) {	// 获取歌曲列表数据
		int total = mKc3x->FileQty & 0x3fff;							// 获取数量
		int now = mKc3x->NamePosition & 0x3fff;
		CLOGI(TAG, "列表显示TTTT  (%02x)(%02x) (%02x)(%02x)(%02x)(%02x)(%02x)(%02x)", gPartList, gAllList,  mKc3x->NameLength, mKc3x->NameSelect, mKc3x->NamePosition, now, (now + mKc3x->NameLength) , total);
		if (gAllList) {									// 读取全部歌曲列表
			if ((now + mKc3x->NameLength) < total) {	// 显示列表的数量小于总数时
				CLOGI(TAG, "全部列表显示AAA (%02x)(%02x)(%02x)(%02x) (%02x)(%02x)", mKc3x->NameLength, now, (now + mKc3x->NameLength), total, mKc3x->NameSelect, mKc3x->NamePosition);
				if (mKc3x->NameLength != 0) {
					SetReg16(&mKc3x->NameSelect, now + mKc3x->NameLength);	// 读取数据
					SetListDbs(now);				
				}
				else {
					CLOGI(TAG, "全部列表显示ccc (%02x)(%02x)(%02x)(%02x)", mKc3x->NameLength, now, mKc3x->NameSelect, mKc3x->NamePosition);
					gAllList = false;	// 读取全部歌曲列表
					MakeTickTime();		// 写入TickTime
					DispList();			// 列表显示
				}
			}else if ((now + mKc3x->NameLength) == total){		// 最后的数据，不再发送读取的动作
				CLOGI(TAG, "全部列表显示BBB (%02x)(%02x)(%02x)(%02x)", mKc3x->NameLength, now, mKc3x->NameSelect, mKc3x->NamePosition);
				if (mKc3x->NameLength != 0) {
					SetListDbs(now);
				}
				gAllList = false;	// 读取全部歌曲列表
				MakeTickTime();		// 写入TickTime
				DispList();			// 列表显示		
			}
		}

		if (gPartList) {			// 读取部分歌曲列表
			CLOGI(TAG, "部分列表显示之PPPP (%02x)(%02x)(%02x)(%02x)(%02x)", (now + mKc3x->NameLength) , total, now, mKc3x->NameLength,  mKc3x->NameSelect);
			if ((now + mKc3x->NameLength) < total) {			// 显示列表的数量小于总数时
				if (mKc3x->NameLength != 0) {
					SetReg16(&mKc3x->NameSelect, now + mKc3x->NameLength);	// 读取数据
					SetListDbs(now);	
				}
			}else if((now + mKc3x->NameLength) == total){		// 最后的数据，不再发送读取的动作
				if (mKc3x->NameLength != 0) {
					SetListDbs(now);
				}
			}
			gPartList = false;
			MakeTickTime();			// 写入TickTime
			DispList();				// 列表显示	
		}
	}

	int offset = 0;
	if ((mKc3x->SrcValid & 0x20) || (mKc3x->SrcValid & 0x40)) {			// SD插入 或 U盘插入
		int total = mKc3x->FileQty & 0x3fff;							// 获取设备里面的总数量
		if (total != 0) {
			char name[256];
			int qty = GetValue("Length", -1);							// 读取文件里面的已有的总数
			int now = mKc3x->NamePosition & 0x3fff;
			if (mKc3x->InSource == 0x30 || mKc3x->InSource == 0x31) {	// SD卡播放 或 U盘播放
				if (qty != 0) {
					if (((mKc3x->PlayGetIdx & 0x3fff) + 1) < qty) {		// 正在播放的编号 小于 文件里面的已有的总数
						GetText(name, sizeof(name), "Name", mKc3x->PlayGetIdx);		// 读取歌曲名字		
					}
					else {		// 正在播放的编号 大于或等于 文件里面的总数， 需要自动获取新的列表数据
						//CLOGI(TAG, "ShowRegister TTTTBBB (%d)(%d-%d) (%d-%d)", now, (now + mKc3x->NameLength) , total, ((mKc3x->PlayGetIdx & 0x3fff) + 1) , qty);
						if ((now + mKc3x->NameLength) <= total) {	// 文件名列表的数量等于或小于设备里面总数时			
							//CLOGI(TAG, "ShowRegister TTTCCC (%d)(%d)(%d)(%d)", (now + mKc3x->NameLength), total, qty, mKc3x->NameLength);
							if (mKc3x->NameLength != 0) {
								if (total != qty) {
									CLOGI(TAG, "ShowRegister TTTQQQ)");
									gPartList = true;					// 读取部分歌曲列表
									gLoadTick = (uint32_t)GetTickCount64();
								}			
							}
						}
						GetText(name, sizeof(name), "Name", mKc3x->PlayGetIdx);		// 读取歌曲名字		
					}

					offset += TxtFormat(bytes + offset, 512 - offset, "%s%s%s\r\n", name, (mKc3x->PlayState & 0x02) ? " 播放已暂停" : "", (mKc3x->PlayState & 0x04) ? " 播放已停止" : "");	//显示歌曲名字
					if (mKc3x->PlayState & 0x04) {			//播放已停止 
						offset += TxtFormat(bytes + offset, 512 - offset, "%02d:%02d  %02d:%02d  (%d / %d)\r\n",0 / 60,0 % 60, mKc3x->FileTime / 60, mKc3x->FileTime % 60, (mKc3x->PlayGetIdx + 1), total);
					}
					else {									// 播放时间
						offset += TxtFormat(bytes + offset, 512 - offset, "%02d:%02d  %02d:%02d  (%d / %d)\r\n", mKc3x->PlayTime / 60, mKc3x->PlayTime % 60, mKc3x->FileTime / 60, mKc3x->FileTime % 60, (mKc3x->PlayGetIdx + 1), total);
					}
		
					if (gPlayIdx != mKc3x->PlayGetIdx && mKc3x->FileTime > 0 && gFileTime != mKc3x->FileTime) {		// 等待正确的mKc3x->FileTime
						gPlayIdx = mKc3x->PlayGetIdx;
						gFileTime = mKc3x->FileTime;
						//CLOGI(TAG, "ShowRegister TTTDDD SD卡播放 (%d)(%d)(%02d:%02d)(%02x)", gPlayIdx, mKc3x->PlayGetIdx, mKc3x->FileTime / 60, mKc3x->FileTime % 60, mKc3x->FileTime);
						SetValue("Time", mKc3x->PlayGetIdx, mKc3x->FileTime);				// 写入歌曲时长
						DispList();			// 列表显示
					}
				}
			}
		}
	}

	if (mKc3x->Flag & 0x02) {				// 静音	查看B1位是高位1还是低位0
		offset += TxtFormat(bytes + offset, 512 - offset, "静音：已打开\r\n");
	}

	bytes[offset] = 0;
	CString string(bytes);
	((CStatic*)GetDlgItem(IDC_EDIT_TIPS))->SetWindowText(string);
}

void CTabMusicPlayer::SetReg16(uint16_t* addr, uint16_t value) {
	int change = (*addr >> 14) + 1;				// 查看B15和B14 然后每次加1   B15:14=改变	
	*addr = (change << 14) | (value & 0x3fff);	// 还原数值
	DntRegWrite();								// 写寄存器
	isTabKc3xRegi = true;
}
void CTabMusicPlayer::MakeTickTime(){			// 写入TickTime
	SetValue("Tick", 0, (int)(GetTickCount64() - gLoadTick));	// 写入读取歌曲的时间
	gLoadTick = 0;
}

void CTabMusicPlayer::SetListDbs(int now) {		// 写入列表数据
	char bytes[0x1000];							// 文件名列表文字，逗号分隔，共111字节
	bytes[ARD_SIZE_NAME_TEXT] = 0;
	memcpy(bytes, mKc3x->NameText, ARD_SIZE_NAME_TEXT);
	MakeFilePath();								// 生成文件路径
	if (GetValue("Length", -1) == (mKc3x->FileQty & 0x3fff)) {		// 如果列表的总数等于设备的总数
		gPartList = false;
		gAllList = false;
		DispList();				// 列表显示(全部显示)
	}
	else {
		SetText("Text", now, bytes);
		SetValue("Length", now, mKc3x->NameLength);	// 写入文件名列表数量（每一笔的数量）
		char* array[128];
		int qty = TxtKeyArray((size_t*)array, bytes, (int)strlen(bytes), '$', 1);
		if (qty < 128) {
			for (int index = 0; index < qty; index++) {
				SetText("Name", now + index, array[index]);		// 写入歌曲名
			}
			SetValue("Length", -1, now + qty);					// 写入已加入列表的歌曲总数
		}
		//DispList();				// 列表显示(全部显示)
		CLOGI(TAG, "写入列表数据数量BB (%d)(%d)(%d)(%d)", now, qty, mKc3x->NameLength, (now + qty));
	}
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// C++语言对话框函数 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// CTabMusicPlayer 对话框
IMPLEMENT_DYNAMIC(CTabMusicPlayer, CDialogEx)

CTabMusicPlayer::CTabMusicPlayer(CWnd* pParent /*=nullptr*/)
	: CDialogEx(IDD_TAB_MUSIC_PLAYER, pParent){
	gSetIndex = 0xffff;
	gKeyTick = 0;
	gLoadTick = 0;
	gPlayOperate = 0;
	gChange = 0;
	gQty = 0;
	gAllList = false;				// 读取全部歌曲列表
	gPartList = false;				// 读取部分歌曲列表

	gPlayIdx = -1;
	gFileTime = -1;
}

CTabMusicPlayer::~CTabMusicPlayer(){
}

void CTabMusicPlayer::DoDataExchange(CDataExchange* pDX){
	CDialogEx::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_LIST1, mList1);
}

BEGIN_MESSAGE_MAP(CTabMusicPlayer, CDialogEx)
	ON_WM_TIMER()
	ON_BN_CLICKED(IDC_BTN_STOP, &CTabMusicPlayer::OnBnClickedBtnStop)
	ON_BN_CLICKED(IDC_BTN_PAUSE, &CTabMusicPlayer::OnBnClickedBtnPause)
	ON_BN_CLICKED(IDC_BTN_PLAY, &CTabMusicPlayer::OnBnClickedBtnPlay)
	ON_BN_CLICKED(IDC_BTN_FAST_BACK, &CTabMusicPlayer::OnBnClickedBtnFastBack)
	ON_BN_CLICKED(IDC_BTN_FAST_FORWARD, &CTabMusicPlayer::OnBnClickedBtnFastForward)
	ON_BN_CLICKED(IDC_BTN_SKIP_DN, &CTabMusicPlayer::OnBnClickedBtnSkipDn)
	ON_BN_CLICKED(IDC_BTN_SKIP_UP, &CTabMusicPlayer::OnBnClickedBtnSkipUp)
	ON_NOTIFY(NM_CUSTOMDRAW, IDC_SLIDER_VOLUME, &CTabMusicPlayer::OnNMCustomdrawSliderVolume)
	ON_BN_CLICKED(IDC_BTN_MUTE_OPEN, &CTabMusicPlayer::OnBnClickedBtnMuteOpen)
	ON_BN_CLICKED(IDC_BTN_MUTE_CLOSE, &CTabMusicPlayer::OnBnClickedBtnMuteClose)

	ON_BN_CLICKED(IDC_BTN_RANDOM, &CTabMusicPlayer::OnBnClickedBtnRandom)
	ON_BN_CLICKED(IDC_BTN_REPEAT, &CTabMusicPlayer::OnBnClickedBtnRepeat)
	ON_BN_CLICKED(IDC_BTN_READ_PART_LIST, &CTabMusicPlayer::OnBnClickedBtnReadPartList)
	ON_BN_CLICKED(IDC_BTN_READ_ALL_LIST, &CTabMusicPlayer::OnBnClickedBtnReadAllList)
	ON_BN_CLICKED(IDC_BTN_MUSIC_SD, &CTabMusicPlayer::OnBnClickedBtnMusicSd)
	ON_BN_CLICKED(IDC_BTN_MUSIC_Udisk, &CTabMusicPlayer::OnBnClickedBtnMusicUdisk)
	ON_BN_CLICKED(IDC_BUTTON_LOGIN, &CTabMusicPlayer::OnBnClickedButtonLogin)

	ON_NOTIFY(NM_DBLCLK, IDC_LIST1, &CTabMusicPlayer::OnDblclkList1)

END_MESSAGE_MAP()


// CTabMusicPlayer 消息处理程序
extern CTabMusicPlayer* mTabMusicPlayer;
static void changRegCallback() {
	if (mTabMusicPlayer != NULL) {
		mTabMusicPlayer->ShowRegister();
	}
}
extern "C" static void loginOkCallback() {
	//DntRegPowerOn(false);										// 读完整的寄存器，一般是在初始化时调用一次
}

BOOL CTabMusicPlayer::OnInitDialog() {
	CDialogEx::OnInitDialog();
	// TODO:  在此添加额外的初始化

	mList1.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_SUBITEMIMAGES | LVS_EX_HEADERDRAGDROP | LVS_EX_MULTIWORKAREAS);
	int col = 0;

	mList1.InsertColumn(col++, _T("序号"), LVCFMT_LEFT, 40);
	mList1.InsertColumn(col++, L"歌曲名", LVCFMT_LEFT, 150);
	mList1.InsertColumn(col++, L"时长", LVCFMT_LEFT, 150);


	mKc3x = (KC3X_REGI_DIFF*)mTEST.MyReg;
	mTabMusicPlayer = this;
	isTabKc3xRegi = false;
	ShowAccount(true);
	MakeFilePath();			// 生成文件路径
	ShowRegister();
	gQty = mKc3x->FileQty;		// 歌曲数量
	TestChangRegCallback(changRegCallback);

	SetTimer(1, 1000, NULL);
	return TRUE;  // return TRUE unless you set the focus to a control
	// 异常: OCX 属性页应返回 FALSE
}

void CTabMusicPlayer::OnTimer(UINT_PTR nIDEvent) {
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	if (isTabKc3xRegi) {
		isTabKc3xRegi = false;
		ShowRegister();
	}
	
	if (gKeyTick != 0) {
		if ((GetTickCount64() - gKeyTick) > 5000){			// 如果时间大于5秒
			CLOGI(TAG, "下一首 OnTimerOnTimer ");
			gSetIndex = 0xffff;
			gKeyTick = 0;
		}
	}
	CDialogEx::OnTimer(nIDEvent);
}

////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
void CTabMusicPlayer::OnBnClickedButtonLogin() {		// 登录物链域名
	CPopAccount dlg;
	dlg.DoModal();
	TestChangRegCallback(changRegCallback);
	TestLoginOkCallback(loginOkCallback);
}

void CTabMusicPlayer::OnBnClickedBtnPlay() {		// 播放	  (B0=播放 B1=暂停 B2=停止 B4=随机 B5=重复 B7:6=改变)
	++gPlayOperate;
	CLOGI(TAG, "播放器AA (%d)", gPlayOperate);
	if ((mKc3x->SrcValid & 0x20) || (mKc3x->SrcValid & 0x40)) {		// SD插入 或 U盘插入
		if (mKc3x->InSource == 0x30 || mKc3x->InSource == 0x31) {	// SD卡播放 或 U盘播放
			mKc3x->PlayOperate = 0x01 | gPlayOperate << 6;			// 将B0变为高位1 (播放)
			DntRegWrite();											// 写寄存器
			isTabKc3xRegi = true;
		}
	}
}

void CTabMusicPlayer::OnBnClickedBtnPause() {		// 暂停
	++gPlayOperate;
	CLOGI(TAG, "播放器bb (%d)", gPlayOperate);
	if ((mKc3x->SrcValid & 0x20) || (mKc3x->SrcValid & 0x40)) {		// SD插入 或 U盘插入
		if (mKc3x->InSource == 0x30 || mKc3x->InSource == 0x31) {	// SD卡播放 或 U盘播放
			mKc3x->PlayOperate = 0x02 | gPlayOperate << 6;			// 将B1变为高位1 (暂停)
			DntRegWrite();											// 写寄存器
			isTabKc3xRegi = true;
		}
	}
}

void CTabMusicPlayer::OnBnClickedBtnStop() {		// 停止
	++gPlayOperate;
	if ((mKc3x->SrcValid & 0x20) || (mKc3x->SrcValid & 0x40)) {		// SD插入 或 U盘插入
		if (mKc3x->InSource == 0x30 || mKc3x->InSource == 0x31) {	// SD卡播放 或 U盘播放
			mKc3x->PlayOperate = 0x04 | gPlayOperate << 6;			// 将B2变为高位1 (停止)
			DntRegWrite();											// 写寄存器
			isTabKc3xRegi = true;
		}
	}
}

void CTabMusicPlayer::OnBnClickedBtnFastForward() {	// 快进
	/*
	++gPlayOperate;
	if ((mKc3x->SrcValid & 0x20) || (mKc3x->SrcValid & 0x40)) {		// SD插入 或 U盘插入
		if (mKc3x->InSource == 0x30 || mKc3x->InSource == 0x31) {	// SD卡播放 或 U盘播放
			CLOGI(TAG, "播放器快进 AA (%02x)", mKc3x->PlayOperate);
			mKc3x->PlayOperate = 0x40 | gPlayOperate << 6;			// 将B6变为高位1 (快进)
			CLOGI(TAG, "播放器快进 BB (%02x)", mKc3x->PlayOperate);
			DntRegWrite();								// 写寄存器
			isTabKc3xRegi = true;
		}
	}
	*/
}

void CTabMusicPlayer::OnBnClickedBtnFastBack() {		// 快退
	/*
	++gPlayOperate;
	if ((mKc3x->SrcValid & 0x20) || (mKc3x->SrcValid & 0x40)) {		// SD插入 或 U盘插入
		if (mKc3x->InSource == 0x30 || mKc3x->InSource == 0x31) {	// SD卡播放 或 U盘播放
			CLOGI(TAG, "播放器快退 AA (%02x)", mKc3x->PlayOperate);
			mKc3x->PlayOperate = 0x80 | gPlayOperate << 6;			// 将B7变为高位1 (快退)
			CLOGI(TAG, "播放器快退 BB (%02x)", mKc3x->PlayOperate);
			DntRegWrite();								// 写寄存器
			isTabKc3xRegi = true;
		}
	}
	*/
}

void CTabMusicPlayer::OnBnClickedBtnRandom() {		// 随机
	++gPlayOperate;
	if ((mKc3x->SrcValid & 0x20) || (mKc3x->SrcValid & 0x40)) {		// SD插入 或 U盘插入
		if (mKc3x->InSource == 0x30 || mKc3x->InSource == 0x31) {	// SD卡播放 或 U盘播放
			mKc3x->PlayOperate = 0x10 | gPlayOperate << 6;			// 将B4变为高位1 (随机)
			DntRegWrite();											// 写寄存器
			isTabKc3xRegi = true;
		}
	}
}


void CTabMusicPlayer::OnBnClickedBtnRepeat() {		// 重复
	++gPlayOperate;
	if ((mKc3x->SrcValid & 0x20) || (mKc3x->SrcValid & 0x40)) {		// SD插入 或 U盘插入
		if (mKc3x->InSource == 0x30 || mKc3x->InSource == 0x31) {	// SD卡播放 或 U盘播放
			mKc3x->PlayOperate = 0x20 | gPlayOperate << 6;			// 将B5变为高位1 (重复)
			DntRegWrite();											// 写寄存器
			isTabKc3xRegi = true;
		}
	}
}

void CTabMusicPlayer::OnBnClickedBtnSkipDn() {		// 上一首
	gKeyTick = (uint32_t)GetTickCount64();
	if (gSetIndex == 0xffff) {						
		gSetIndex = mKc3x->PlayGetIdx;
	}
	if ((mKc3x->SrcValid & 0x20) || (mKc3x->SrcValid & 0x40)) {		// SD插入 或 U盘插入
		if (mKc3x->InSource == 0x30 || mKc3x->InSource == 0x31) {	// SD卡播放 或 U盘播放
			if (gSetIndex == 0) {									// 如果要第一首的时候
				if ((mKc3x->FileQty & 0x3fff) != 0) {
					gSetIndex = ((mKc3x->FileQty & 0x3fff) - 1);	// 最后一首
				}				
			}
			else {
				--gSetIndex;						// 减一首
			}			
			SetReg16(&mKc3x->PlaySetIdx, gSetIndex);
		}
	}
}

void CTabMusicPlayer::OnBnClickedBtnSkipUp() {		// 下一首
	gKeyTick = (uint32_t)GetTickCount64();
	if (gSetIndex == 0xffff) {
		gSetIndex = mKc3x->PlayGetIdx;
	}
	if ((mKc3x->SrcValid & 0x20) || (mKc3x->SrcValid & 0x40)) {		// SD插入 或 U盘插入
		if (mKc3x->InSource == 0x30 || mKc3x->InSource == 0x31) {	// SD卡播放 或 U盘播放
			if (gSetIndex == (mKc3x->FileQty & 0x3fff) !=0) {
				gSetIndex = 0x00;									// 设置位第一首
			}
			else {
				++gSetIndex;										// 加一首
			}
			SetReg16(&mKc3x->PlaySetIdx, gSetIndex);
		}
	}
}

void CTabMusicPlayer::OnNMCustomdrawSliderVolume(NMHDR* pNMHDR, LRESULT* pResult){		// 音量调节
	LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
	int position = ((CSliderCtrl*)GetDlgItem(IDC_SLIDER_VOLUME))->GetPos();
	DNT_INFO* info = &mTEST.Info;
	if (info->LoginOk) {
		ShowSlider(position);
		DntRegWrite();								// 写寄存器
		isTabKc3xRegi = true;
	}
	*pResult = 0;
}

void CTabMusicPlayer::OnBnClickedBtnMuteOpen() {	// 打开静音  // 标志 B0=STANDBY B1=MUTE B2=杜比数码动态压缩 B4-B6为对应的控制位
	mKc3x->Flag |= 0x02;							// 将B1变为高位1
	mKc3x->Flag |= 0x20;							// B4-B6为对应的控制位
	DntRegWrite();									// 写寄存器
	isTabKc3xRegi = true;
}

void CTabMusicPlayer::OnBnClickedBtnMuteClose() {	// 关闭静音  // 标志 B0=STANDBY B1=MUTE B2=杜比数码动态压缩 B4-B6为对应的控制位
	CLOGI(TAG, "关闭静音A (%02x)", mKc3x->Flag);
	mKc3x->Flag &= ~0x02;							// 将B1变为低位0
	mKc3x->Flag |= 0x20;							// B4-B6为对应的控制位
	DntRegWrite();									// 写寄存器
	isTabKc3xRegi = true;
}

void CTabMusicPlayer::OnBnClickedBtnReadPartList(){	// 读取部分歌曲
	gPartList = true;								// 读取部分歌曲列表
	gLoadTick = (uint32_t)GetTickCount64();
}


void CTabMusicPlayer::OnBnClickedBtnReadAllList(){	// 读取全部歌曲
	gAllList = true;								// 读取全部歌曲列表
	gLoadTick = (uint32_t)GetTickCount64();
}

void CTabMusicPlayer::OnBnClickedBtnMusicSd(){		// SD/TF卡
	if ((mKc3x->SrcValid & 0x20)) {					// SD插入 
		mKc3x->InSource = KCM_INPUT_SD;
		//CLOGI(TAG, "播放AAA A (%02x)(%02x)(%d)", (mKc3x->PlayState & 0x02), (mKc3x->PlayState & 0x04), gPlayOperate);
		if ((mKc3x->PlayState & 0x02)|| (mKc3x->PlayState & 0x04)) {	// 暂停或停止
			++gPlayOperate;
			mKc3x->PlayOperate = 0x01 | gPlayOperate << 6;				// 将B0变为高位1 (播放)
		}	
		DntRegWrite();													// 写寄存器
		isTabKc3xRegi = true;
	}
}

void CTabMusicPlayer::OnBnClickedBtnMusicUdisk(){	// U盘
	if ((mKc3x->SrcValid & 0x40)) {					// U盘插入
		mKc3x->InSource = KCM_INPUT_UDISK;
		if ((mKc3x->PlayState & 0x02) || (mKc3x->PlayState & 0x04)) {	// 暂停或停止
			++gPlayOperate;
			mKc3x->PlayOperate = 0x01 | gPlayOperate << 6;				// 将B0变为高位1 (播放)
		}
		DntRegWrite();													// 写寄存器
		isTabKc3xRegi = true;
	}
}

void CTabMusicPlayer::OnDblclkList1(NMHDR* pNMHDR, LRESULT* pResult) {	// 双击选择歌曲播放
	int nItem = mList1.GetSelectionMark();								// 获取选中行的编号
	SetReg16(&mKc3x->PlaySetIdx, nItem);
}
